// 定义一个副作用函数桶，存放一个个的副作用函数
// 这里bucket就不能是一个set对象，而必须是一个map对象
const bucket = new Map()

// 定义一个全局变量。保存当前正在执行的副作用函数
let activeEffect = null

function isObject (value) {
  return typeof value === 'object' && value !== null
}

// 收集依赖
function track (target, key) {
  if (!activeEffect) {
    return
  }
  let depSet = bucket.get(key)
  if (!depSet) {
    depSet = new Set()
    bucket.set(key, depSet)
  }
  // 只有activeEffect有值时（保存的是副作用函数），才添加到桶中
  depSet.add(activeEffect)
}

function trigger (target, key) {
  let depSet = bucket.get(key)
  if (depSet) {
    depSet.forEach(element => {
      element()
    })
  }
}
/**
 * 创建响应式数据
 * @param [object ]:普通对象
 * @return [Proxy ]：代理对象
 */
function reactive (data) {
  if (!isObject(data)) return
  return new Proxy(data, {
    get (target, key) {
      // get操作时收集依赖
      track(target, key)
      return target[key]
    },
    set (target, key, value) {
      target[key] = value
      // set操作时触发依赖
      trigger(target, key)
      return true
    }
  })
}

/**
 * 注册副作用函数
 * @param [object ]:需要注册的副作用函数
 *
 */
function registEffect (fn) {
  if (typeof fn !== 'function') return
  // 记录正在执行的副作用函数
  activeEffect = fn
  // 调用副作用函数
  fn()
  // 重置全局变量
  activeEffect = null
}
